package com.elitedatai.mchtest.manage.service;

import com.dji.sdk.cloudapi.firmware.OtaProgress;
import com.elitedatai.mchtest.component.mqtt.model.EventsReceiver;
import com.elitedatai.mchtest.manage.model.dto.DeviceDTO;

import java.util.Optional;
import java.util.Set;


/**
 * 设备Redis服务接口，定义了设备在Redis中缓存相关操作的方法
 */
public interface IDeviceRedisService {

    /**
     * 判断设备是否在线
     * @param sn 设备序列号
     * @return 设备在线状态
     */
    Boolean checkDeviceOnline(String sn);

    /**
     * 查询Redis中设备的基础信息
     * @param sn 设备序列号
     * @return 设备DTO对象的可选包装
     */
    Optional<DeviceDTO> getDeviceOnline(String sn);

    /**
     * 在Redis中保存设备的基础信息
     * @param device 设备DTO对象
     */
    void setDeviceOnline(DeviceDTO device);

    /**
     * 删除Redis中保存的设备基础信息
     * @param sn 设备序列号
     * @return 删除结果
     */
    Boolean delDeviceOnline(String sn);

    /**
     * 保存设备的OSD实时数据
     * @param sn 设备序列号
     * @param data OSD数据
     */
    void setDeviceOsd(String sn, Object data);

    /**
     * 获取设备的OSD实时数据
     * @param sn 设备序列号
     * @param clazz 数据类型Class对象
     * @param <T> 数据类型
     * @return OSD数据的可选包装
     */
    <T> Optional<T> getDeviceOsd(String sn, Class<T> clazz);
    /**
     * 删除设备的OSD实时数据
     * @param sn 设备序列号
     * @return 删除结果
     */
    Boolean delDeviceOsd(String sn);

    /**
     * 在Redis中保存设备的固件更新进度
     * @param sn 设备序列号
     * @param events 固件更新进度事件接收器
     */
    void setFirmwareUpgrading(String sn, EventsReceiver<OtaProgress> events);

    /**
     * 查询Redis中设备的固件更新进度
     * @param sn 设备序列号
     * @return 固件更新进度事件接收器的可选包装
     */
    Optional<EventsReceiver<OtaProgress>> getFirmwareUpgradingProgress(String sn);

    /**
     * 删除Redis中设备的固件更新进度
     * @param sn 设备序列号
     * @return 删除结果
     */
    Boolean delFirmwareUpgrading(String sn);

    /**
     * 在Redis中保存设备的HMS键值
     * @param sn 设备序列号
     * @param keys HMS键值数组
     */
    void addEndHmsKeys(String sn, String... keys);

    /**
     * 查询Redis中设备的所有HMS键值
     * @param sn 设备序列号
     * @return HMS键值集合
     */
    Set<String> getAllHmsKeys(String sn);

    /**
     * 删除Redis中设备的所有HMS键值
     * @param sn 设备序列号
     * @return 删除结果
     */
    Boolean delHmsKeysBySn(String sn);

    /**
     * 网关设备下线处理
     * @param gatewaySn 网关设备序列号
     */
    void gatewayOffline(String gatewaySn);

    /**
     * 子设备下线处理
     * @param deviceSn 子设备序列号
     */
    void subDeviceOffline(String deviceSn);
}